package com.deer.wms.base.system.dao.ware;

import com.deer.wms.base.system.model.ware.CellInfoCriteria;
import com.deer.wms.base.system.model.ware.CellInfoVo;
import com.deer.wms.base.system.web.ware.CellInfoController;
import com.deer.wms.common.core.commonMapper.Mapper;
import com.deer.wms.base.system.model.ware.CellInfo;
import com.deer.wms.base.system.model.ware.CellInfoDto;
import org.apache.ibatis.annotations.Param;

import java.util.List;

/**
 * 货位设置 数据层
 * 

 * @date 2019-05-08
 */
public interface CellInfoMapper extends Mapper<CellInfo>
{



	/**
	 * 出库时查询是否需要盘点
	 * @param cellInfo
	 * @return
	 */
	CellInfo findStateByCellInfo(CellInfo cellInfo);

	/**
	 * 货位一览 进行查看
	 * @param cellInfoDto
	 * @return
	 */
	List<CellInfoDto> findByCellInfoDto(CellInfoDto cellInfoDto);

	/**
	 * 根据任务id查找货位信息
	 *
	 * @param taskId
	 * @return
	 */
	public CellInfo getCellInfoByTaskId(String taskId);


	/**
	 * 查询没有托盘的货位  排序查第一个
	 *
	 * @return
	 */
	public CellInfo getCellInfoHasNoBoxInfo();
	
	/**
	 *缓存线入库更新货位时查询货位
	 * @author 李帅辰
	 * @date 2021/6/3 18:30
	 * @return com.deer.wms.base.system.model.ware.CellInfo
	 */
	CellInfo getCellBySheId(Integer shelfId);

	/**
	 * 根据物料名，物料编码，批次 查找货位相关信息
	 *
	 * @return
	 */
	public List<CellInfoDto> findCellInfoDtoByItemNameAndItemCodeAndBatch
				(@Param("itemName") String itemName,@Param("itemCode") String itemCode,@Param("batch") String batch);


	/**
	 * 查询货位表主键最大值，用于同步添加容器box
	 *
	 * @return
	 */
	public Integer selectMaxCellInfoId();


	/**
	 * 根据货架ID查询所有货位信息
	 *
	 * @param shelfId
	 * @return
	 */
	public List<CellInfo> selectCellInfoByShelfId(Integer shelfId);
	
	/**
	 *缓存线出库时修改货位查询
	 * @author 李帅辰
	 * @date 2021/6/7 19:04 
	 * @return java.util.List<com.deer.wms.base.system.model.ware.CellInfo>
	 */
	List<CellInfo> findCellIdByShelfId(Integer shelfId);

	/**
     * 查询货位设置信息
     * 
     * @param cellId 货位设置ID
     * @return 货位设置信息
     */
	public CellInfo selectCellInfoById(Integer cellId);

	public CellInfo selectCellInfoByCellCode(String cellCode);
	/**
	 * 查询货位设置信息
	 *
	 * @param cellId 货位设置ID
	 * @return 货位设置信息
	 */
	public CellInfoDto selectCellInfoDtoOne(Integer cellId);

	public List<CellInfo> selectNullCellInfo(Integer shelfId);

	/**
     * 查询货位设置列表
     * 
     * @param cellInfo 货位设置信息
     * @return 货位设置集合
     */
	public List<CellInfo> selectCellInfoList(CellInfo cellInfo);


	/**
	 * 查询货位设置列表
	 *
	 * @param cellInfo 货位设置信息
	 * @return 货位设置集合
	 */
	public List<CellInfoDto> selectCellInfoDtoList(CellInfo cellInfo);

	/**
     * 新增货位设置
     * 
     * @param cellInfo 货位设置信息
     * @return 结果
     */
	public int insertCellInfo(CellInfo cellInfo);
	
	/**
     * 修改货位设置
     * 
     * @param cellInfo 货位设置信息
     * @return 结果
     */
	public int updateCellInfo(CellInfo cellInfo);
	
	/**
     * 删除货位设置
     * 
     * @param cellId 货位设置ID
     * @return 结果
     */
	public int deleteCellInfoById(Integer cellId);
	
	/**
     * 批量删除货位设置
     * 
     * @param cellIds 需要删除的数据ID
     * @return 结果
     */
	public int deleteCellInfoByIds(String[] cellIds);

	void deleteByShelfId(Integer shelfId);

	Double cellOccupyRatio();
	int notItemCell();
	int count();
	int available();

	/**
	 * 查询无货货位
	 * @return
	 */
	CellInfoDto getBestCell();
	/**
	 * 根据批次与料号查询信息
	 * @param criteria
	 * @return
	 */
	List<CellInfoDto> findList(CellInfoCriteria criteria);

	List<CellInfo> selectCellInfoListByAreaId(Integer areaId);

	CellInfoDto findByCellId(Integer cellId);
	/**
	 * 获取仓库货位的总数
	 */
	int CellInfoCount();

	/**
	 * 获取状态下的总数
	 * @return
	 */
	int CellInfoCountByState();
	
	/**
	 * 获取空余货位的数量
	 * @author 李帅辰
	 * @date 2021/6/17 15:47 
	 * @return int
	 */
	int getCellEmptyCount();

	/**
	 * 批量禁用货位状态
	 */
	public int updateStateByIds(String[] ids);

	public int updateStateUpByIds(String[] ids);

	public List<CellInfoVo> findLists(CellInfoVo cellInfoVo);

	public List<CellInfoVo> findZTreeLists(CellInfoVo cellInfoVo);

    int checkBlankCellCountByRoadWay(Integer roadWay);

	List<CellInfo> selectTopBlankCellInfo(@Param("roadWay") Integer roadWay,
										  @Param("startIndex") Integer startIndex);

	CellInfo checkSideCellStatus(@Param("teamNumber") Integer teamNumber,
								 @Param("teamPai") Integer teamPai,
								 @Param("lie") Integer lie,
								 @Param("floor") Integer floor);

	int checkBlankCellCount();

    CellInfo selectOneBlankCellInfoByRoadWay(@Param("roadWay") Integer roadWay,
											 @Param("itemId")Integer itemId);
	
	/**
	 *查询该巷道有多少货位被使用
	 * @author 李帅辰
	 * @date 2021/5/26 16:07 
	 * @return int
	 */
    int getCellInfoCountByShelf(Integer shelfId);

    int getSpaceCellInfoCount(Integer shelfId);

    CellInfo findPaiAndfloorByShelfId(Integer shelfId);
}